#include "stackADT.h"
#include <stdlib.h>
#include <stdio.h>

#define STACK_SIZE 100

struct stack_type
{
    Item *contents;
    int top;
    int size;
};

static void terminate(const char *mess)
{
    printf("%s\n", mess);
    exit(EXIT_FAILURE);
}

Stack create(int size)
{
    Stack s = malloc(sizeof(*s));
    if (!s)
        terminate("Error in create: stack could not be created.");
    s->top = 0;
    s->size = size;
    s->contents = malloc(sizeof(*s->contents) * s->size);
    if (!s->contents)
        terminate("Error in create: stack could not be created.");

    return s;
}

void destroy(Stack s)
{
    free(s->contents);
    free(s);
}

void make_empty(Stack s)
{
    s->top = 0;
}

bool is_empty(const Stack s)
{
    return s->top == 0;
}

bool is_full(const Stack s)
{
    return s->top == s->size;
}

void push(Stack s, Item i)
{
    if (is_full(s))
        terminate("Error in push: stack is full");
    s->contents[s->top++] = i;
}

Item pop(Stack s)
{
    if (is_empty(s))
        terminate("Error in pop: stack is empty");
    return s->contents[--s->top];
}